﻿using RuoVea.ExDto;
using RuoVea.ExEnum;
using System.ComponentModel.DataAnnotations;

namespace RuoVea.OmiApi.Dict.Service.Dto;

/// <summary>
/// 字典类型查询参数
/// </summary>
public class SysDictTypeParam : PageParam
{
    /// <summary>
    /// 名称 - 字典类型的显示名称，用于界面展示
    /// 示例："用户状态", "订单类型", "首页大图"
    /// </summary>
    public string Name { get; set; }

    /// <summary>
    /// 编码 - 字典类型的唯一编码标识，用于程序识别
    /// 示例："USER_STATUS", "ORDER_TYPE", "HOME_CAROUSEL"
    /// </summary>
    public string Code { get; set; }

    /// <summary>
    /// 状态 - 控制字典类型是否启用
    /// 0: 正常(启用)，1: 停用(禁用)
    /// </summary>
    public YesOrNot? IsDisable { get; set; }

        /// <summary>
    /// 系统内置标识 - 标识是否为系统内置字典类型
    /// YesOrNot.Y: 系统内置(不可删除)，YesOrNot.N: 用户自定义(可删除)，默认值：YesOrNot.N
    /// 系统内置字典类型通常包含系统运行必需的基础数据
    /// </summary>
    public YesOrNot? SysFlag { get; set; }

}

/// <summary>
/// 字典类型数据传输对象
/// </summary>
public class SysDictTypeDto
{
    /// <summary>
    /// 主键Id
    /// </summary>
    public long? Id { get; set; }

    /// <summary>
    /// 创建时间
    /// </summary>
    public DateTime? CreateTime { get; set; }

    /// <summary>
    /// 创建人
    /// </summary>
    public long? Creator { get; set; }

    /// <summary>
    /// 修改时间
    /// </summary>
    public DateTime? ModifyTime { get; set; }

    /// <summary>
    /// 修改人
    /// </summary>
    public long? Modifier { get; set; }

    /// <summary>
    /// 逻辑删除:0=未删除,1=已删除 Default:0
    /// </summary>
    public int? Deleted { get; set; }

    /// <summary>
    /// 名称 - 字典类型的显示名称，用于界面展示
    /// 示例："用户状态", "订单类型", "首页大图"
    /// </summary>
    [Required, MaxLength(256)]
    public string Name { get; set; }

    /// <summary>
    /// 编码 - 字典类型的唯一编码标识，用于程序识别，全大写英文和下划线
    /// 示例："USER_STATUS", "ORDER_TYPE", "HOME_CAROUSEL"
    /// </summary>
    [Required, MaxLength(256)]
    //[RegularExpression(@"^[A-Z][A-Z0-9_]*$", ErrorMessage = "编码格式不正确，必须全大写英文、数字和下划线，且以字母开头")]
    public string Code { get; set; }

    /// <summary>
    /// 排序 - 显示顺序，数值越小越靠前
    /// </summary>
    public int Sort { get; set; }

    /// <summary>
    /// 备注 - 字典类型的详细描述信息
    /// 示例："管理用户账号状态选项", "定义订单的各种类型"
    /// </summary>
    public string Remark { get; set; }

    /// <summary>
    /// 状态 - 控制字典类型是否启用
    /// 0: 正常(启用)，1: 停用(禁用)
    /// 停用时，该类型下的所有字典值都将不可用
    /// </summary>
    public int IsDisable { get; set; } = 0;

    /// <summary>
    /// 系统内置标识 - 标识是否为系统内置字典类型
    /// 1: 系统内置(不可删除)，0: 用户自定义(可删除)
    /// 系统内置字典类型通常包含系统运行必需的基础数据
    /// </summary>
    public int SysFlag { get; set; }
}

/// <summary>
/// 下拉框字典类型输入参数
/// </summary>
public class DropDownDictTypeInput
{
    /// <summary>
    /// 编码 - 字典类型的唯一编码标识
    /// 示例："USER_STATUS", "ORDER_TYPE", "HOME_CAROUSEL"
    /// </summary>
    [Required(ErrorMessage = "字典类型编码不能为空")]
    public string Code { get; set; }
}

/// <summary>
/// 修改字典类型状态输入参数
/// </summary>
public class ChangeStateDictTypeInput
{
    /// <summary>
    /// Id - 字典类型主键ID
    /// </summary>
    [Required(ErrorMessage = "字典类型Id不能为空")]
    public long Id { get; set; }

    /// <summary>
    /// 状态 - 控制字典类型是否启用
    /// YesOrNot.N: 正常(启用)，YesOrNot.Y: 停用(禁用)
    /// 停用时，该类型下的所有字典值都将不可用
    /// </summary>
    public YesOrNot IsDisable { get; set; }
}

/// <summary>
/// 字典类型与字典值构造的树形结构输出
/// </summary>
public class DictTreeOutput
{
    /// <summary>
    /// Id - 节点ID
    /// </summary>
    public long Id { get; set; }

    /// <summary>
    /// 父Id - 父节点ID，字典类型的父ID为0
    /// </summary>
    public long Pid { get; set; }

    /// <summary>
    /// 编码 - 对应字典值的编码
    /// </summary>
    public string Code { get; set; }

    /// <summary>
    /// 名称 - 对应字典值的value或字典类型的名称
    /// </summary>
    public string Name { get; set; }

    /// <summary>
    /// 子节点集合 - 包含字典值或下级节点
    /// </summary>
    public List<DictTreeOutput> Children { get; set; } = new List<DictTreeOutput>();
}